.TITLE OLRSR .IDENT /04.03/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; K. E. KINNEAR 27-JUN-78 ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; P. J. BEZEREDI ; ; MODIFIED BY: ; ; J. M. LAWLER 01-JUN-82 04.01 ; ; JL110 -- CONDITIONALIZE MODULE ON R$$CON ; ADD SUBROUTINE $VOLSC FOR PHASE 2 ; SUPPORT OF AUTOMOUNT/DISMOUNT ; ; D. Carroll 16-May-1993 04.10 ; DC210 -- Addition of KS.MRC support for multiprocessor ; KRB simplification of IIST,DT07,MKA11 ; ; D. Carroll 18-Oct-1995 04.11 ; DC404 -- Include PSECT definition to allow for full ; expansion of ICB pool during sysgen ; ; ; ; ONLINE RECONFIGURATION SERVICE ROUTINES ; ;DC404 .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 ;+ ; **-$KRBSC-CALL DRIVER AT KRB STATUS CHANGE ENTRY. ; ; THIS ROUTINE WILL CALL THE DRIVER AT ITS KRB STATUS CHANGE ENTRY ; SPECIFIED IN THE DDT. IF THE DRIVER IS A COMMON INTERRUPT DRIVER, ; THEN IT WILL BE CALLED AT THE CI.KRB ENTRY. ENTRY CONDITIONS ARE ; DETAILED IN THE ROUTINE BODY. IF THE ENTRY ADDRESS = 0 ; THEN THE DRIVER OR COMMON INTERRUPT ROUTINE WILL NOT BE ; CALLED. ; ; INPUTS: ; ; $SCDEV=KRB ADDRESS OF CONTROLLER CHANGING STATUS. ; $SCOFL=BYTE FLAG ONLINE/OFFLINE: ; ; -1 --> ONLINE TO OFFLINE TRANSITION. ; 0 --> OFFLINE TO ONLINE TRANSITION. ; 100 --> OFFLINE TO ONLINE TRANSITION SPECIAL CASE. ; ; $SCCTB=CTB ADDRESS OF CONTROLLER CHANGING STATUS. ; $SCURM=URM OF MULTI-URM CONTROLLER TO CHANGE ; ; OUTPUTS: ; ; DRIVER HAS BEEN CALLED AT ENTRY. WHEN $SCDEV GOES TO ZERO, ; THEN $SCERR (BYTE VALUE) CONTAINS STATUS (I.E. WHETHER OPERATION ; WAS ACCEPTED OR REJECTED). NEGATIVE VALUES SIGNAL REJECTION, ; ONE SIGNALS SUCCESSFUL COMPLETION. ; ; $SCDEV MAY TAKE SOME TIME TO GO TO ZERO. ALLOW AT LEAST 60 SECS. ; ; NO REGISTERS ARE PRESERVED. ; ; APR5/APR6 MAPPING IS PRESERVED. ; ; NOTE: $KRBSC AND $UCBSC MUST NOT BE USED TOGETHER, AS THEY ; USE COMMON PARAMETER PASSING AREAS. ;- .IF DF R$$CON ;RECONFIGURATION SUPPORT .ENABL LSB $KRBSC::MOV $SCCTB,R3 ;GET CTB ADDRESS MOVB #1,$SCERR ;SHOW SUCCESS STATUS MOV KINAR5,-(SP) ;SAVE I-SPACE MAPPING .IF DF K$$DAS MOV KDSAR5,-(SP) ;SAVE D-SPACE MAPPING .ENDC MOV #REMAP,-(SP) ;SET ADDRESS TO RESTORE KISAR5, KDSAR5 MOV L.DCB(R3),R4 ;GET DCB POINTER FROM CTB BITB #LS.CIN,L.STS(R3) ;IS THIS A COMMON INTERRUPT CTB? BNE 10$ ;IF NE YES ; ; DRIVER IS NOT COMMON INTERRUPT DRIVER -- HAS UCB AND MAY ; OR MAY NOT BE LOADED DRIVER. ; MOV D.UCB(R4),R5 ;GET ANY UCB FOR DRIVER MAPPING MOV D.DSP(R4),R4 ;GET DRIVER DISPATCH TABLE BNE 5$ ;IF NE DRIVER IS LOADED ; ; DRIVER IS NOT LOADED -- RETURN IE.HWR (HANDLER NOT RESIDENT) ERROR ; MOVB #IE.HWR,$SCERR ;SET ERROR CODE 5$: MOV U.SCB(R5),R2 ;GET SCB ADDRESS (OF ANY SCB) MOV S.KS5(R2),KINAR5 ;MAP DRIVER I SPACE .IF DF K$$DAS MOV S.KS5(R2),KDSAR5 ;MAP DRIVER D SPACE .ENDC BR 15$ ;REENTER FLOW 10$: ADD #CI.KRB-D.VKRB,R4 ;MAKE R4 LOOK LIKE DDT POINTER 15$: ;REFERENCE LABEL .IF DF M$$PRO MOV $SCDEV,R2 ;GET KRB ADDRESS BIT #KS.MRC,K.STS(R2) ; IS THIS A MULTI-URM CONTROLLER? BNE 18$ ; IF NE YES, USE $SCURM MOV K.URM(R2),$SCURM ; USE CONTROLLER SPECIFIED URM 18$: MOV $SCURM,R2 ; SELECT THE DESIRED URM MOV #20$,R3 ;SET UP FOR $EXROP CALLR $EXROP .IFTF ; ; AT THIS POINT, WE ARE ON CORRECT CPU ; 20$: ;REFERENCE LABEL .IFT MOV $SCCTB,R3 ;GET CTB ADDRESS AGAIN .ENDC MOV $SCDEV,R2 ;GET KRB ADDRESS ASRB $SCOFL ;CHECK IF ONLINE OR OFFLINE BCS 30$ ;IF CS OFFLINE TRANSITION (DONT CHECK CSR) MOV #30$,-(SP) ;SET UP FOR $SGFIN CALL $SGFIN ;WE EXPECT NXM TRAPS ; ; SEE IF DRIVER IS COMMON INTERRUPT DRIVER. IF IT IS, THEN IF ; ITS CI.CSR ENTRY IS NON-ZERO, CALL IT THERE TO TEST THE CSR. ; OTHERWISE, TEST THE CSR JUST LIKE WE DO FOR ALL OTHER DEVICES. ; BITB #LS.CIN,L.STS(R3) ;IS IT COMMON INT DRIVER BEQ 23$ ;IF EQ NO -- NORMAL TEST TST D.VKRB+(R4) ;IS CI.CSR ZERO BEQ 23$ ;IF EQ YES -- NORMAL TEST ; ; CALL COMMON INTERRUPT DRIVER AT CI.CSR ENTRY POINT. ; ; ENTRY CONDITIONS: ; ; R2=KRB ADDRESS. ; R3=CTB ADDRESS. ; ; $SGFIN HAS BEEN CALLED, THEREFORE DRIVER IS PROTECTED ; FROM NXM TRAPS. ON TST INSTRUCTIONS, IF C BIT CLR, ; THEN LOCATION WAS THERE. IF C BIT SET, THEN LOCATION ; CAUSED A NXM TRAP. ; ; NO REGISTERS ARE AVAILABLE FOR USE -- DRIVER MUST ; SAVE AND RESTORE ANY REGISTERS USED. ; ; EXIT CONDTIONS: ; ; NO REGISTERS CAN BE CHANGED. ; ; IF DEVICE PRESENT, C BIT CLR. ; IF DEVICE NOT PRESENT, C BIT SET. ; CALL @D.VKRB+(R4) ;CALL DRIVER BR 24$ ;REENTER CODE FLOW 23$: TSTB @(R2) ;IS THE CSR THERE? 24$: BCC 25$ ;IF CC YES MOVB #IE.OFL,$SCERR ;SHOW NO CSR ERROR STATUS 25$: RETURN ;EXIT $SGFIN 30$: TSTB $SCERR ;HAVE WE ALREADY FOUND AN ERROR? BMI 50$ ;IF MI YES -- SKIP CALL TO DRIVER AND EXIT ASRB $SCOFL ;GET OFFLINE BIT INTO SIGN BIT ; ; CALL DRIVER AT KRB STATUS CHANGE ENTRY. ENTRY CONDITIONS ARE: ; ; INPUTS TO DRIVER: ; ; R2=KRB ADDRESS FOR KRB CHANGING STATUS. ; R3=CTB ADDRESS FOR THE ABOVE KRB. ; 0(SP)=RETURN ADDRESS FOR COMPLETION. ; 2(SP)=RETURN ADDRESS TO CALLER OF $KRBSC. ; CARRY BIT CONTAINS STATUS TRANSITION: ; ; C=1 --> ONLINE TO OFFLINE TRANSITION. ; C=0 --> OFFLINE TO ONLINE TRANSITION. ; ; $SCERR=1. ; $SCOFL=POSITIVE/NON-ZERO IF SPECIAL OFFLINE TO ONLINE CASE. ; ; RETURNED INFORMATION FROM DRIVER: ; ; DRIVER MUST EVENTUALLY RETURN CONTROL TO: ; ; 0(SP) THEN THE RETURN STATUS IS CONTAINED IN $SCERR: ; ; $SCERR < 0 --> OPERATION NOT SUCCESSFUL. ; $SCERR = 1 --> OPERATION SUCCESSFUL. ; $SCERR = 0 --> SPECIAL CASE OPERATION STILL ; IN PROGRESS. ; ; IF $SCERR < 0, THEN VALUE IS ERROR CODE. ; ; DRIVER MUST RETURN WITHIN 60 SECS. (USE THE S.CTM TIMEOUT ; FEATURE IF NECESSARY.) ; ; ALL REGISTERS ARE AVAILABLE TO THE DRIVER. ; ; ; AT THIS TIME, THE CARRY BIT CONTAINS INFORMATION FOR THE DRIVER ; 40$: MOV D.VKRB(R4),R0 ;TEST FOR ZERO WITHOUT CHANGING C-BIT BEQ 50$ ;IF EQ DONT CALL DRIVER CALL @D.VKRB(R4) ;CALL DRIVER 50$: MOV $SCDEV,R2 ;GET KRB ADDRESS .IF DF M$$PRO BIT #KS.MRC,K.STS(R2) ; IS THIS A MULTI-URM CONTROLLER? BNE $OLRNT ; YES, DRIVER RESPONSIBILITY .ENDC ;DF,M$$PRO MOVB $SCOFL,R0 ;GET DESIRED STATUS MOVB $SCERR,R1 ;GET ERROR TYPE SXT R1 ;MAKE R1 ALL 1'S OR 0'S XOR R1,R0 ;FLIP BITS IN R0 IF R1 SHOW ERROR BIC #^C,R0 ;R0 CONTAINS KS.OFL BIT BIC #KS.OFL,K.STS(R2) ;MAKE SURE OFFLINE BIT IS PROPER STATE BIS R0,K.STS(R2) ;SET OFFLINE BIT TO DESIRED STATUS ;+ ; **-$OLRNT-ONLINE RECONFIGURATION NOTIFICATION ROUTINE. ; ; THIS ROUTINE WILL CLEAR $SCDEV AND SET EVENT FLAG 1 FOR THE ; TASK POINTED TO BY $HRCPT. ; ; INPUTS: ; ; NONE. ; ; OUTPUTS: ; ; NONE. ; ; NO REGISTERS ARE PRESERVED. ;- $OLRNT::CLR $SCDEV ;SHOW OPERATION COMPLETE MOV #1,R0 ;SET EVENT FLAG TO SET MOV $HRCPT,R5 ;GET HRC... TCB ADDRESS BEQ 60$ ;IF EQ NOT INSTALLED BIT #TS.EXE,T.STAT(R5) ;IS TASK ACTIVE? BNE 60$ ;IF NE NO -- DON'T CALL $SETF BIT #T2.SEF,T.ST2(R5) ;IS TASK STOPPED FOR EVENT FLAG? BNE 60$ ;IF NE YES -- DON'T CALL $SETF MOV R5,R1 ;CREATE ADDRESS WORD ADD #T.EFLG,R1 ;POINT TO FIRST TASK WORD CALLR $SETM ;SET HRC'S EVENT FLAG ONE 60$: RETURN ;+ ; **-$UCBSC-CALL DRIVER AT UCB STATUS CHANGE ENTRY POINT. ; ; THIS ROUTINE WILL CALL A DRIVER AT ITS UCB STATUS CHANGE ENTRY ; POINT. ; ; INPUTS: ; ; $SCDEV=UCB ADDRESS OF UNIT WITH CHANGING STATUS. ; $SCOFL=BYTE VALUE OF DESIRED STATUS CHANGE: ; ; -1 --> ONLINE TO OFFLINE TRANSITION. ; 0 --> OFFLINE TO ONLINE TRANSITION. ; 100 --> OFFLINE TO ONLINE TRANSITION SPECIAL CASE. ; ; OUTPUTS: ; ; DRIVER HAS BEEN CALLED AT D.VUCB ENTRY. WHEN $SCDEV GOES TO ; ZERO THEN $SCERR (BYTE VALUE) CONTAINS RETURN STATUS (I.E. ; WHETHER OPERATION WAS ACCEPTED OR REJECTED). NEGATIVE VALUES ; SIGNIFY REJECTION, ONE SIGNALS SUCCESSFUL COMPLETION. ; IF THE ENTRY POINT IN THE DRIVER EQUALS ZERO, THEN ; THE DRIVER IS NOT CALLED. ; ; $SCDEV MAY TAKE UP TO 60 SECS TO CLEAR. ; ; NO REGISTERS ARE PRESERVED. ; ; APR5/APR6 MAPPING IS PRESERVED. ; ; NOTE: $UCBSC SHOULD NOT BE USED WHILE $KRBSC IS IN USE DUE ; TO COMMON USE OF PARAMETER AREAS. ;- $UCBSC::MOV $SCDEV,R5 ;GET UCB ADDRESS .IF DF M$$PRO MOV U.SCB(R5),R4 ;GET SCB ADDRESS MOV S.KRB(R4),R3 ;GET KRB ADDRESS, IF ANY BEQ 65$ ;IF EQ NO KRB ADDRESS MOV K.URM(R3),S.URM(R4) ;SET URM FOR SCB 65$: ;REFERENCE LABEL .ENDC MOV KINAR5,-(SP) ;SAVE I-SPACE MAPPING .IF DF K$$DAS MOV KDSAR5,-(SP) ;SAVE D-SPACE MAPPING .ENDC MOV #REMAP,-(SP) ;SET ADDRESS TO RESTORE KISAR5, KDSAR5 .IF DF M$$PRO CALL $IFORK ;CONTINUE EXECUTION ON CORRECT CPU .ENDC ; ; WE ARE NOW EXECUTING ON THE CORRECT PROCESSOR ; 70$: MOV (R5),R3 ;GET DCB ADDRESS MOV U.SCB(R5),R4 ;GET SCB ADDRESS MOV D.DSP(R3),R2 ;GET DDT ADDRESS BNE 80$ ;IF NE DRIVER IS LOADED ; ; DRIVER IS NOT LOADED ; MOVB #IE.HWR,$SCERR ;SET ERROR CODE BR 90$ ;EXIT WITH COMMON CODE 80$: MOVB #1,$SCERR ;SHOW SUCCESS STATUS MOV S.KRB(R4),R3 ;GET KRB ADDRESS BEQ 85$ ;IF EQ NO KRB MOVB K.CON(R3),R3 ;GET CONTROLLER INDEX 85$: ;REFERENCE LABEL .IF NDF M$$PRO MOV S.KS5(R4),KINAR5 ;SET UP KERNEL MAPPING .IF DF K$$DAS MOV S.KS5(R4),KDSAR5 ;SET UP KERNEL DATA SPACE MAPPING .ENDC .ENDC TST D.VUCB(R2) ;DOES THE DRIVER WANT TO BE CALLED? BEQ 90$ ;IF EQ NO ASRB $SCOFL ;SET CARRY BIT FOR DRIVER IF NECESSARY ; ; CALL DRIVER AT UCB STATUS CHANGE ENTRY. ; ; INPUTS TO DRIVER: ; ; R3=CONTROLLER INDEX. IF S.KRB=0 THEN R3 UNDEFINED. ; R4=ADDRESS OF THE STATUS CONTROL BLOCK. ; R5=ADDRESS OF THE UNIT CONTROL BLOCK. ; 0(SP)=RETURN ADDRESS FOR COMPLETION. ; 2(SP)=RETURN ADDRESS TO CALLER OF $UCBSC. ; CARRY BIT CONTAINS STATUS TRANSITION: ; ; C=1 --> ONLINE TO OFFLINE TRANSITION. ; C=0 --> OFFLINE TO ONLINE TRANSITION. ; ; $SCERR=1. ; $SCOFL=POSITIVE/NON-ZERO IF SPECIAL OFFLINE TO ONLINE CASE. ; ; RETURNED INFORMATION FROM DRIVER: ; ; THE DRIVER MUST EVENTUALLY RETURN CONTROL TO: ; ; 0(SP) AND THEN RETURN STATUS IS IN $SCERR: ; ; $SCERR < 0 --> OPERATION NOT SUCCESSFUL. ; $SCERR = 1 --> OPERATION SUCCESSFUL. ; $SCERR = 0 --> SPECIAL CASE OPERATION STILL ; IN PROGRESS. ; ; IF $SCERR < 0, THEN VALUE IS ERROR CODE. ; ; DRIVER MUST RETURN CONTROL WITHIN 60 SECS. (USE S.CTM TIMEOUT ; IF NECESSARY.) ; ; ALL REGISTERS ARE AVAILABLE TO THE DRIVER. ; CALL @D.VUCB(R2) ;CALL DRIVER 90$: MOV $SCDEV,R5 ;GET UCB ADDRESS BACK MOVB $SCOFL,R0 ;GET DESIRED STATUS OF OFL BIT MOVB $SCERR,R1 ;GET ERROR VALUE SXT R1 ;MAKE R1 ALL 1'S OR 0'S FROM SIGN BIT XOR R1,R0 ;FLIP BITS IN R0 IF R1 SHOWS ERROR BIC #^C,R0 ;R0 CONTAINS DESIRED STATE OF US.OFL BICB #US.OFL,U.ST2(R5) ;CLEAR OUT OFFLINE BIT JUST IN CASE BISB R0,U.ST2(R5) ;SET ACTUAL BIT VALUE INTO U.ST2 BR $OLRNT ;EXIT THRU COMMON CODE .DSABL LSB ; ; REMAP -- RESET KINAR5/(KDSAR5) WITH SAVED VALUE AND RETURN. ; REMAP: ;REFERENCE LABEL .IF DF K$$DAS MOV (SP)+,KDSAR5 ;RESTORE DATA SPACE REGISTER .ENDC MOV (SP)+,KINAR5 ;RESTORE ALTERNATIVE REGISTER RETURN ;+ ; **-$CPUSC-CPU STATUS CHANGE ROUTINE. ; ; THIS ROUTINE WILL PERFORM THE EXECUTIVE ACTIONS NECESSARY TO ; BRING A CPU ONLINE OR TO TAKE A CPU OFFLINE. ; ; INPUTS: ; ; $SCDEV=MASK WITH BIT SET FOR CPU WHOSE STATUS SHOULD CHANGE. ONLY ; ONE BIT SHOULD BE SET. ; $SCOFL=BYTE VALUE OF DESIRED STATUS CHANGE: ; ; -1 --> ONLINE TO OFFLINE TRANSITION. ; 0 --> OFFLINE TO ONLINE TRANSITION. ; ; OUTPUTS: ; ; CPU ONLINE: ; ; THE CPU HAS BEEN "BOOTED" THRU THE IIST, AND THEN ; INTERRUPTED INTO THE $PENT PROCESSOR ENTRY. ; AT THIS POINT THIS ROUTINE WILL RETURN TO THE CALLER ; WITH: ; ; R2=MASK OF PROCESSORS WHO DIDN'T RESET THE INTERRUPT MASKS (IF ANY). ; ; WHEN THE PROCESSOR COMMING ONLINE CALLS $CPNIT (AT THE ; VERY END OF THE $PENT PROCESS) IT WILL ATTEMPT TO ; INTERRUPT THE CURRENTLY ONLINE CPUS TO SEE IF THEY CAN ; RECEIVE FROM IT. IT WILL LEAVE THE MASK OF THOSE WHO ; CAN'T HEAR IT IN $SCRET, AND THEN ENTER $OLRNT TO ; NOTIRY HRC... THAT THE CPU IS ONLINE. ; ; CPU OFFLINE: ; ; THE CALLER WILL BE RETURNED TO AFTER THE NECESSARY CPU ; HAS BEEN INTERRUPTED WITH THE OFFLINE FUNCTION. WHEN ; LOCAL EVENT FLAG ONE IS SET, THE PROCESSOR HAS HALTED. ; ; NO REGISTERS ARE PRESERVED. ; ; APR5/APR6 MAPPING IS PRESERVED. ; ; THIS ROUTINE SHARES COMMON DATA AND PARAMETER AREAS WITH THE OTHER ; $XXXSC ROUTINES IN THIS MODULE. THEY SHOULD ONLY BE USED ONE AT A ; TIME. ;- .IF DF M$$PRO $CPUSC::TSTB $SCOFL ;ONLINE OR OFFLINE? BMI 30$ ;IF MI GOING OFFLINE ; ; BRING CPU ONLINE ; CLRB $SCERR ;NO IMMEDIATE ERROR YET MOV #C.LGTH,R1 ;ALLOCATE CLOCK BLOCK CALL $ALOCB ;OF CORRECT SIZE FROM POOL BCC 10$ ;IF CC BLOCK ALLOCATED OK, ADDR IN R0 MOVB #IE.NOD,$SCERR ;BAD NEWS -- NO POOL SPACE LEFT RETURN ;EXIT BACK TO OLRSR 10$: MOV R0,-(SP) ;SAVE CLOCK QUEUE BLOCK FOR LATER BIS $SCDEV,$IIMSK ;SET INTERRUPT MASK UP CALL $IISTM ;MAKE EVERYONE SET UP THEIR MASKS MOV R2,-(SP) ;SAVE PEOPLE WHO DIDN'T DO THE JOB MOV $SCDEV,R1 ;GET THE CPU COMING ONLINE AGAIN CALL $IBXMT ;SEND HIM A BOOT MESSAGE! CLR $SCRET ;CLEAR OUT STATUS MOV 2(SP),R0 ;GET CLOCK QUEUE BLOCK BACK MOV (SP)+,(SP) ;SLIDE STATUS RETURN DOWN ONE FRAME MOV #20$,C.SUB(R0) ;SET SUBROUTINE ADDRESS MOV $TKPS,R2 ;GET TICKS PER SECOND CLR R1 ;CLEAR OUT HIGH ORDER DELTA TIME ASL R2 ASL R2 ;WAIT FOR 4 SECONDS MOV #C.SYST,R4 ;SET REQUEST TYPE MOV $TKTCB,R5 ;SET REQUEST IDENTIFIER CALL $CLINS ;INSERT IN CLOCK QUEUE MOV (SP)+,R2 ;GET STATUS BACK RETURN ; ; SUBROUTINE FOR INTERPROCESSOR INTERRUPT ; 20$: MOV R4,R0 ;GET CLOCK BLOCK ADDRESS MOV #C.LGTH,R1 ;SET LENGTH CALL $DEACB ;DEALLOCATE CLOCK BLOCK MOV $SCDEV,R1 ;GET PROCESSOR(S) CALLR $IIXMT ;INTERRUPT THEM ; ; BRING CPU OFFLINE ; 30$: MOV #MP.STP,R2 ;SET STOP FUNCTION MOV $SCDEV,R1 ;GET CPU'S TO DO IT TO CLR $SCRET ;CLEAR OUT STATUS RETURN CLRB $SCERR ;CLEAR OUT STATUS RETURN CALLR $IIFNX ;TRANSMIT FUNCTION ;+ ; **-$CPOFF-TAKE CPU OFFLINE. ; ; THIS ROUTINE WILL TAKE A CPU OFFLINE. IT WILL RESET THE INTERRUPT ; MASKS OF ALL OTHER ONLINE PROCESSORS TO NOT ALLOW INTERRUPTS FROM ; THIS ONE, WILL RESET THE IIST ON THIS CPU TO ALLOW INTERRUPTS FROM ; ANYONE, WILL DECLARE A SIGNIFICANT EVENT, AND CLEAR OUT THE ONLINE ; BIT FROM $URMST FOR THIS PROCESSOR. ; ; INPUTS: ; ; NONE. ; ; OUTPUTS: ; ; NONE. ; ; NO REGISTERS ARE PRESERVED. ;- $CPOFF::BIC $CPBIT,$IIMSK ;PREPARE TO RESET THE INTERRUPT MASKS OF CALL $IISTM ;ALL OTHER ONLINE CPUS. CALL $IIOPN ;INITIALIZE OUR IIST, TO ALLOW INT AND BOOTS CLRB $CXDBL ;IN CASE CONTEXT SWITCHING DISABLED BIC $CPBIT,$URMST ;SHOW US NOT ONLINE ANYMORE CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT AND EXIT .ENDC .IFF ; DF R$$CON $KRBSC:: $OLRNT:: $UCBSC:: $CPOFF:: RETURN .ENDC ; DF R$$CON ; **-$VOLSC-VOLUME STATUS CHANGE ; ; THIS SUBROUTINE IS CALLED BY A DRIVER WHEN HARDWARE VOLUME ; VALID STATUS CHANGES. MINIMALLY, $VOLSC RE-SETS SOFTWARE ; VOLUME VALID. IF THE VOLUME MOUNTED FOREIGN THEN THIS ; IS THE ONLY ACTION TAKEN ON THE UNIT. IF THE VOLUME IS ; MOUNTED FILE-STRUCTURED OR NOT MOUNTED THE VERIFICATION ; TASK WILL BE REQUESTED TO EITHER MOUNT OR RE-MOUNT THE ; VOLUME. ADDITIONALLY, I/O WILL BE STALLED TO UNITS ; MOUNTED WITH A FILE-STRUCTURE UNTIL THE VOLUME ; STATUS CAN BE VERIFIED. ; ; INPUTS: ; ; R5=UCB ADDRESS OF UNIT WITH TRANSITION ; ; OUTPUTS: ; ; NONE. ; ; R4,R5 PRESERVED ; ;- .ENABL LSB $VOLSC:: ; .IF DF R$$AMD ;AUTOMOUNT/DISMOUNT SAVNR BICB #US.VV,U.STS(R5) ;RE-SET SOFTWARE VOLUME VALID BITB #US.FOR,U.STS(R5) ;VOLUME MOUNTED FOREIGN ? BNE 20$ ;IF NE, YES - NOTHING MORE TO DO BITB #US.MNT,U.STS(R5) ;VOLUME MOUNTED ? BNE 10$ ;IF NE, NO BISB #US.SIO,U.ST2(R5) ;STALL I/O FOR MOUNTED VOLUMES 10$: BISB #US.TRN,U.ST2(R5) ;SET FLAG FOR VERIFICATION TASK MOV $VERTK,R0 ;TCB ADDRESS OF VERIFICATION TASK CALLR $EXRQN ;UNSTOP/REQUEST VER .IFTF ; DF R$$AMD 20$: RETURN ; .DSABL LSB .ENDC ; DF R$$AMD .END